02/02/2025 - 08/02/2025

03/02/2025 15:33

Meeting with Marcus 01/31/2025

UDP Packet format:

Rate Limitations:

Sampling rate:

Using the Threshold Scanner:

Documentation:


03/02/2025 15:34

Here is the table image transcribed

12-bit data format, RAW readout from ASIC

2nd 1 Byte1 [15..8] 1st 1 Byte1 [7..0]
0xE0 channel number [7..0]
0xE[15..12] & trigger arrival time 1 [11..8] trigger arrival time 1 [7..0]
0xE[15..12] & trigger arrival time 2 [11..8] trigger arrival time 2 [7..0]
0xE[15..12] & logical position [11..8] logical position [7..6] & physical position [5..0]
sample 1 data [15..8] sample 1 data [7..4] & sample 2 data [3..0]
sample 2 data [15..8] sample 3 data [7..0]
sample 3 data [15..12] & sample 4 data [11..8] sample 4 data [7..0]
... ...
sample 31 data [15..12] & sample 32 data [11..8] sample 32 data [7..0]
0x0A 0x5A
CRC packet footer
... ...
0xE0 channel number [7..0]
0xE[15..12] & trigger arrival time 1 [11..8] trigger arrival time 1 [7..0]
0xE[15..12] & trigger arrival time 2 [11..8] trigger arrival time 2 [7..0]
0xE[15..12] & logical position [11..8] logical position [7..6] & physical position [5..0]
sample 1 data [15..8] sample 1 data [7..4] & sample 2 data [3..0]
sample 2 data [15..8] sample 3 data [7..0]
sample 3 data [15..12] & sample 4 data [11..8] sample 4 data [7..0]
... ...
sample 31 data [15..12] & sample 32 data [11..8] sample 32 data [7..0]
0x0A 0x5A
CRC packet footer

16-bit "expanded" data, used in NaluDAQ

2nd 1 Byte1 [15..8] 1st 1 Byte1 [7..0]
0xE0 channel number [7..0]
0x0[15..12] & trigger arrival time 1 [11..8] trigger arrival time 1 [7..0]
0x0[15..12] & trigger arrival time 2 [11..8] trigger arrival time 2 [7..0]
0x0[15..12] & logical position [11..8] logical position [7..6] & physical position [5..0]
sample 1 data [11..8] sample1 data [7..0]
sample 2 data [11..8] sample2 data [7..0]
... ...
sample 32 data [11..8] sample 32 data [7..0]
0x0A 0x5A
0xFE 0xCA
... ...
0xE0 channel number [7..0]
0x0[15..12] & trigger arrival time 1 [11..8] trigger arrival time 1 [7..0]
0x0[15..12] & trigger arrival time 2 [11..8] trigger arrival time 2 [7..0]
0x0[15..12] & logical position [11..8] logical position [7..6] & physical position [5..0]
sample 1 data [11..8] sample1 data [7..0]
sample 2 data [11..8] sample2 data [7..0]
... ...
sample 32 data [11..8] sample 32 data [7..0]
0x0A 0x5A
0xFE 0xCA

03/02/2025 15:47

I was able to get a conda environment to have root and some machine learning libraries at the same time. It took a few attempts because there's some nuance. First off, the ML libraries are a few versions of python behind, so I had to use python 3.10 (as oppose to 3.12). Second, I had to use the correct keywords when building the environment:

conda create --name root_env -c conda-forge -c root python=3.10 cudatoolkit=11.8 numpy matplotlib scikit-learn pytorch=2.1 torchvision tensorflow jupyter
conda create --name root_env -c conda-forge -c root python=3.10 cudatoolkit=11.8 numpy matplotlib scikit-learn pytorch=2.1 torchvision tensorflow jupyter

ROOT seemed to not want to install, so I tried it again

conda install -c conda-forge root
conda install -c conda-forge root

and it seemed to install on the second pass. This notably doesn't include torch audio, if that's needed.

Afterwards you can test some of the installations:

python -c "import torch; print(torch.cuda.is_available())"
python -c "import tensorflow as tf; print(tf.__version__)"
python -c "import sklearn; print(sklearn.__version__)"
python -c "import ROOT; print(ROOT.__version__)
python -c "import torch; print(torch.cuda.is_available())"
python -c "import tensorflow as tf; print(tf.__version__)"
python -c "import sklearn; print(sklearn.__version__)"
python -c "import ROOT; print(ROOT.__version__)

03/02/2025 16:52

341d0ca7cbbdb08e4cfbf6e8eb507de4.png

Judging by this plot, I'm pretty sure we're in the 16-bit "expanded" data because I see 8 bytes, then data, then a footer byte (0xFA5A). This footer byte does not match the image Marcus sent us but does match the input parameters to the HDSoC class:

class HDSoCParser(Parser):
    def __init__(self, params):
        super().__init__(params)
        self._stop_word = params.get("stop_word", b"\xfa\x5a")
        if isinstance(self._stop_word, str):
            self._stop_word = bytes.fromhex(self._stop_word)
        self._chan_mask = params.get("chanmask", 0x3F)
        self._chan_shift = params.get("chanshift", 0)
        self._abs_wind_mask = params.get("abs_wind_mask", 0x3F)
        self._evt_wind_mask = params.get("evt_wind_mask", 0x3F)
        self._evt_wind_shift = params.get("evt_wind_shift", 6)
        self._headers = params.get("headers", 4)
        self._timing_mask = params.get("timing_mask", 0xFFF)
        self._timing_shift = params.get("timing_mask", 12)
        self._packet_size = 72
class HDSoCParser(Parser):
    def __init__(self, params):
        super().__init__(params)
        self._stop_word = params.get("stop_word", b"\xfa\x5a")
        if isinstance(self._stop_word, str):
            self._stop_word = bytes.fromhex(self._stop_word)
        self._chan_mask = params.get("chanmask", 0x3F)
        self._chan_shift = params.get("chanshift", 0)
        self._abs_wind_mask = params.get("abs_wind_mask", 0x3F)
        self._evt_wind_mask = params.get("evt_wind_mask", 0x3F)
        self._evt_wind_shift = params.get("evt_wind_shift", 6)
        self._headers = params.get("headers", 4)
        self._timing_mask = params.get("timing_mask", 0xFFF)
        self._timing_shift = params.get("timing_mask", 12)
        self._packet_size = 72

03/02/2025 18:40

I had to fill in some blanks, but I think I was able to correctly reconstruct the channel, time, and samples of a 1040 byte UDP package (not really sure what logical and physical position are):

{'Channel': 0, 'Trigger Time': 16031077, 'Logical Position': 0, 'Physical Position': 29, 'Samples': [1496, 1511, 1503, 1515, 1474, 1489, 1492, 1470, 1488, 1490, 1486, 1467, 1464, 1466, 1480, 1494, 1464, 1506, 1497, 1485, 1489, 1489, 1496, 1516, 1508, 1444, 1482, 1464, 1494, 1486, 1489, 1559], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16032109, 'Logical Position': 0, 'Physical Position': 7, 'Samples': [1489, 1498, 1504, 1514, 1488, 1497, 1490, 1488, 1492, 1508, 1468, 1490, 1491, 1471, 1480, 1461, 1467, 1496, 1512, 1498, 1468, 1461, 1505, 1500, 1492, 1487, 1520, 1494, 1504, 1495, 1494, 1518], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16033142, 'Logical Position': 0, 'Physical Position': 48, 'Samples': [1509, 1455, 1442, 1519, 1528, 1481, 1515, 1494, 1506, 1497, 1480, 1494, 1464, 1477, 1489, 1483, 1509, 1511, 1491, 1484, 1494, 1488, 1441, 1468, 1472, 1494, 1474, 1466, 1467, 1486, 1527, 1493], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16034175, 'Logical Position': 0, 'Physical Position': 27, 'Samples': [1478, 1506, 1492, 1520, 1458, 1495, 1467, 1469, 1476, 1504, 1512, 1486, 1468, 1494, 1518, 1504, 1491, 1523, 1516, 1494, 1502, 1461, 1452, 1443, 1491, 1520, 1512, 1495, 1488, 1500, 1473, 1522], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16035207, 'Logical Position': 0, 'Physical Position': 5, 'Samples': [1503, 1490, 1445, 1512, 1491, 1491, 1496, 1496, 1443, 1505, 1514, 1502, 1483, 1442, 1496, 1490, 1490, 1494, 1502, 1512, 1503, 1488, 1508, 1491, 1490, 1499, 1485, 1454, 1458, 1474, 1486, 1511], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16037273, 'Logical Position': 0, 'Physical Position': 25, 'Samples': [1479, 1518, 1501, 1525, 1494, 1484, 1494, 1457, 1505, 1492, 1507, 1500, 1467, 1486, 1506, 1513, 1501, 1490, 1494, 1488, 1465, 1477, 1468, 1496, 1493, 1520, 1515, 1486, 1478, 1510, 1488, 1541], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16038305, 'Logical Position': 0, 'Physical Position': 3, 'Samples': [1468, 1467, 1507, 1541, 1503, 1508, 1516, 1477, 1492, 1470, 1524, 1512, 1504, 1496, 1499, 1517, 1465, 1505, 1499, 1471, 1480, 1495, 1496, 1517, 1498, 1518, 1464, 1466, 1503, 1492, 1493, 1544], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16039338, 'Logical Position': 0, 'Physical Position': 44, 'Samples': [1531, 1441, 1488, 1482, 1494, 1488, 1506, 1489, 1471, 1486, 1477, 1482, 1470, 1488, 1442, 1463, 1490, 1516, 1500, 1472, 1486, 1514, 1484, 1515, 1487, 1513, 1512, 1494, 1486, 1490, 1513, 1486], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16040371, 'Logical Position': 0, 'Physical Position': 23, 'Samples': [1510, 1486, 1510, 1522, 1486, 1488, 1493, 1457, 1475, 1492, 1539, 1508, 1491, 1470, 1551, 1518, 1504, 1512, 1492, 1468, 1481, 1490, 1499, 1512, 1500, 1490, 1515, 1499, 1516, 1513, 1468, 1552], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16042436, 'Logical Position': 0, 'Physical Position': 42, 'Samples': [1538, 1468, 1467, 1492, 1464, 1477, 1459, 1478, 1488, 1486, 1464, 1464, 1475, 1466, 1480, 1479, 1468, 1504, 1492, 1503, 1486, 1484, 1447, 1486, 1478, 1488, 1490, 1487, 1480, 1478, 1488, 1467], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16043469, 'Logical Position': 0, 'Physical Position': 21, 'Samples': [1502, 1476, 1481, 1517, 1449, 1460, 1465, 1469, 1468, 1502, 1508, 1492, 1464, 1506, 1510, 1495, 1478, 1512, 1504, 1530, 1478, 1477, 1480, 1496, 1473, 1497, 1491, 1487, 1462, 1484, 1462, 1494], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16044502, 'Logical Position': 0, 'Physical Position': 0, 'Samples': [1500, 1517, 1477, 1494, 1476, 1502, 1489, 1463, 1486, 1464, 1467, 1491, 1481, 1493, 1474, 1480, 1512, 1524, 1483, 1482, 1496, 1494, 1432, 1490, 1488, 1513, 1484, 1511, 1477, 1520, 1510, 1537], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16045535, 'Logical Position': 0, 'Physical Position': 41, 'Samples': [1483, 1497, 1470, 1494, 1440, 1485, 1488, 1494, 1459, 1458, 1493, 1486, 1496, 1495, 1499, 1510, 1486, 1493, 1507, 1469, 1487, 1478, 1517, 1489, 1498, 1494, 1488, 1508, 1474, 1511, 1470, 1490], 'Footer': (250, 90)}
{'Channel': 0, 'Trigger Time': 16031077, 'Logical Position': 0, 'Physical Position': 29, 'Samples': [1496, 1511, 1503, 1515, 1474, 1489, 1492, 1470, 1488, 1490, 1486, 1467, 1464, 1466, 1480, 1494, 1464, 1506, 1497, 1485, 1489, 1489, 1496, 1516, 1508, 1444, 1482, 1464, 1494, 1486, 1489, 1559], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16032109, 'Logical Position': 0, 'Physical Position': 7, 'Samples': [1489, 1498, 1504, 1514, 1488, 1497, 1490, 1488, 1492, 1508, 1468, 1490, 1491, 1471, 1480, 1461, 1467, 1496, 1512, 1498, 1468, 1461, 1505, 1500, 1492, 1487, 1520, 1494, 1504, 1495, 1494, 1518], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16033142, 'Logical Position': 0, 'Physical Position': 48, 'Samples': [1509, 1455, 1442, 1519, 1528, 1481, 1515, 1494, 1506, 1497, 1480, 1494, 1464, 1477, 1489, 1483, 1509, 1511, 1491, 1484, 1494, 1488, 1441, 1468, 1472, 1494, 1474, 1466, 1467, 1486, 1527, 1493], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16034175, 'Logical Position': 0, 'Physical Position': 27, 'Samples': [1478, 1506, 1492, 1520, 1458, 1495, 1467, 1469, 1476, 1504, 1512, 1486, 1468, 1494, 1518, 1504, 1491, 1523, 1516, 1494, 1502, 1461, 1452, 1443, 1491, 1520, 1512, 1495, 1488, 1500, 1473, 1522], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16035207, 'Logical Position': 0, 'Physical Position': 5, 'Samples': [1503, 1490, 1445, 1512, 1491, 1491, 1496, 1496, 1443, 1505, 1514, 1502, 1483, 1442, 1496, 1490, 1490, 1494, 1502, 1512, 1503, 1488, 1508, 1491, 1490, 1499, 1485, 1454, 1458, 1474, 1486, 1511], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16037273, 'Logical Position': 0, 'Physical Position': 25, 'Samples': [1479, 1518, 1501, 1525, 1494, 1484, 1494, 1457, 1505, 1492, 1507, 1500, 1467, 1486, 1506, 1513, 1501, 1490, 1494, 1488, 1465, 1477, 1468, 1496, 1493, 1520, 1515, 1486, 1478, 1510, 1488, 1541], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16038305, 'Logical Position': 0, 'Physical Position': 3, 'Samples': [1468, 1467, 1507, 1541, 1503, 1508, 1516, 1477, 1492, 1470, 1524, 1512, 1504, 1496, 1499, 1517, 1465, 1505, 1499, 1471, 1480, 1495, 1496, 1517, 1498, 1518, 1464, 1466, 1503, 1492, 1493, 1544], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16039338, 'Logical Position': 0, 'Physical Position': 44, 'Samples': [1531, 1441, 1488, 1482, 1494, 1488, 1506, 1489, 1471, 1486, 1477, 1482, 1470, 1488, 1442, 1463, 1490, 1516, 1500, 1472, 1486, 1514, 1484, 1515, 1487, 1513, 1512, 1494, 1486, 1490, 1513, 1486], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16040371, 'Logical Position': 0, 'Physical Position': 23, 'Samples': [1510, 1486, 1510, 1522, 1486, 1488, 1493, 1457, 1475, 1492, 1539, 1508, 1491, 1470, 1551, 1518, 1504, 1512, 1492, 1468, 1481, 1490, 1499, 1512, 1500, 1490, 1515, 1499, 1516, 1513, 1468, 1552], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16042436, 'Logical Position': 0, 'Physical Position': 42, 'Samples': [1538, 1468, 1467, 1492, 1464, 1477, 1459, 1478, 1488, 1486, 1464, 1464, 1475, 1466, 1480, 1479, 1468, 1504, 1492, 1503, 1486, 1484, 1447, 1486, 1478, 1488, 1490, 1487, 1480, 1478, 1488, 1467], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16043469, 'Logical Position': 0, 'Physical Position': 21, 'Samples': [1502, 1476, 1481, 1517, 1449, 1460, 1465, 1469, 1468, 1502, 1508, 1492, 1464, 1506, 1510, 1495, 1478, 1512, 1504, 1530, 1478, 1477, 1480, 1496, 1473, 1497, 1491, 1487, 1462, 1484, 1462, 1494], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16044502, 'Logical Position': 0, 'Physical Position': 0, 'Samples': [1500, 1517, 1477, 1494, 1476, 1502, 1489, 1463, 1486, 1464, 1467, 1491, 1481, 1493, 1474, 1480, 1512, 1524, 1483, 1482, 1496, 1494, 1432, 1490, 1488, 1513, 1484, 1511, 1477, 1520, 1510, 1537], 'Footer': (250, 90)}

{'Channel': 0, 'Trigger Time': 16045535, 'Logical Position': 0, 'Physical Position': 41, 'Samples': [1483, 1497, 1470, 1494, 1440, 1485, 1488, 1494, 1459, 1458, 1493, 1486, 1496, 1495, 1499, 1510, 1486, 1493, 1507, 1469, 1487, 1478, 1517, 1489, 1498, 1494, 1488, 1508, 1474, 1511, 1470, 1490], 'Footer': (250, 90)}

this looks very similar to the data I got from NaluScopes acquistions:

{'window_labels': [[], [], [32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 47], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], [], [], [], []],
'evt_window_labels': [[], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], []], 'data': [array([],
dtype=float64), array([], dtype=float64), array([2053, 2108, 2102, 2078,
2073, 2092, 2099, 2090, 2058, 2074, 2076,
 2095, 2094, 2078, 2028, 2069, 2106, 2088, 2072, 2025, 2009, 2082,
 2078, 2067, 2068, 2058, 2028, 2054, 2024, 2075, 2074, 2080, 2056,
 2046, 2071, 2076, 2054, 2044, 2078, 2085, 2002, 2032, 2040, 2035,
 2033, 2046, 2050, 2025, 2033, 2078, 2071, 2040, 2005, 2026, 2044,
 2040, 2003, 2040, 2046, 2032, 2055, 2076, 2054, 2025, 2040, 2069,
 2082, 2088, 2048, 2046, 2052, 1984, 1664, 1573, 1573, 1620, 1572,
 1558, 1529, 1518, 1534, 1541, 1538, 1480, 1491, 1516, 1520, 1477,
 1529, 1519, 1459, 1488, 1486, 1500, 1517, 1516, 1590, 1516, 1566,
 1554, 1518, 1517, 1528, 1516, 1455, 1446, 1486, 1466, 1488, 1468,
 1467, 1452, 1486, 1467, 1510, 1526, 1463, 1492, 1487, 1451, 1491,
 1506, 1468, 1491, 1496, 1516, 1493, 1481, 1487, 1493, 1492, 1490,
 1470, 1469, 1484, 1502, 1495, ...
 1627, 1623, 1618, 1645, 1595, 1614, 1622, 1667, 1606, 1620, 1648,
 1619, 1669, 1614, 1640, 1655, 1616, 1638, 1602, 1642, 1625, 1618,
 1667, 1621, 1618, 1646, 1624, 1646], dtype=uint16), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64)], 'timing': [[], [], [10488814, 10488814, 10488814,
10488814, 10488814, 10488814, 10488814, 10488814, 10488814, 10488814,
10488814, 10488814, 10488814, 10488814, 10488814, 10488814], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], []], 'time': [array([], dtype=float64), array([],
dtype=float64), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12,
 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
 117, 118, 119, 120, ...
 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493,
 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506,
 507, 508, 509, 510, 511]), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64)],
'created_at': 0, 'pkg_num': 0, 'event_num': 0, 'name': None}
{'window_labels': [[], [], [32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 47], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], [], [], [], []],
'evt_window_labels': [[], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], []], 'data': [array([],
dtype=float64), array([], dtype=float64), array([2053, 2108, 2102, 2078,
2073, 2092, 2099, 2090, 2058, 2074, 2076,
 2095, 2094, 2078, 2028, 2069, 2106, 2088, 2072, 2025, 2009, 2082,
 2078, 2067, 2068, 2058, 2028, 2054, 2024, 2075, 2074, 2080, 2056,
 2046, 2071, 2076, 2054, 2044, 2078, 2085, 2002, 2032, 2040, 2035,
 2033, 2046, 2050, 2025, 2033, 2078, 2071, 2040, 2005, 2026, 2044,
 2040, 2003, 2040, 2046, 2032, 2055, 2076, 2054, 2025, 2040, 2069,
 2082, 2088, 2048, 2046, 2052, 1984, 1664, 1573, 1573, 1620, 1572,
 1558, 1529, 1518, 1534, 1541, 1538, 1480, 1491, 1516, 1520, 1477,
 1529, 1519, 1459, 1488, 1486, 1500, 1517, 1516, 1590, 1516, 1566,
 1554, 1518, 1517, 1528, 1516, 1455, 1446, 1486, 1466, 1488, 1468,
 1467, 1452, 1486, 1467, 1510, 1526, 1463, 1492, 1487, 1451, 1491,
 1506, 1468, 1491, 1496, 1516, 1493, 1481, 1487, 1493, 1492, 1490,
 1470, 1469, 1484, 1502, 1495, ...
 1627, 1623, 1618, 1645, 1595, 1614, 1622, 1667, 1606, 1620, 1648,
 1619, 1669, 1614, 1640, 1655, 1616, 1638, 1602, 1642, 1625, 1618,
 1667, 1621, 1618, 1646, 1624, 1646], dtype=uint16), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64)], 'timing': [[], [], [10488814, 10488814, 10488814,
10488814, 10488814, 10488814, 10488814, 10488814, 10488814, 10488814,
10488814, 10488814, 10488814, 10488814, 10488814, 10488814], [], [], [], [],
[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], [], [], [], [], []], 'time': [array([], dtype=float64), array([],
dtype=float64), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12,
 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
 117, 118, 119, 120, ...
 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493,
 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506,
 507, 508, 509, 510, 511]), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64),
array([], dtype=float64), array([], dtype=float64), array([],
dtype=float64), array([], dtype=float64), array([], dtype=float64)],
'created_at': 0, 'pkg_num': 0, 'event_num': 0, 'name': None}

04/02/2025 10:06

1f0a0abd2a2803585905e659ead32172.png

It looks like python can handle about 7.5 MB/s per thread. The performance is slightly better for smaller "chunks" thrown into the algorithm. I.e. if I give the algorithm aaa times more data it will take a^{1.07}a1.07a^{1.07} times longer to handle it (i.e the data rate will slow down).


04/02/2025 10:43

Here is the non log version of the plot, just to help
d32f2342301c46535a21e1ba87beefc0.png


04/02/2025 11:44

Steps I follow to build the simulation:

  1. Clone https://github.com/PIONEER-Experiment/main
    git clone git@github.com:PIONEER-Experiment/main.git
    git clone git@github.com:PIONEER-Experiment/main.git
  2. Follow the steps in the README.md for building in a docker container, you can find them on the main page.
  3. You may need the additional argument to link your ssh id for cloning private repos inside the docker. Check your ~/.ssh for your public key, for example:
    -v ~/.ssh/id_ed25519:/root/.ssh/id_ed25519
    -v ~/.ssh/id_ed25519:/root/.ssh/id_ed25519
  4. In the docker container edit /simulation/checkout-branches.sh to point to the branches you want, then run:
    git pull --recurse-submodules
    ./checkout-branches.sh
    git pull --recurse-submodules
    ./checkout-branches.sh
  5. Then you should be able to build everything with ./setup.sh -aelr. Look at ./setup.sh --help for information on what each flag does

06/02/2025 12:50

Pi -> e + nu pattern recognition performance:

cd614f6dac0171bf369f4833599a557a.png

34b075d957ec603cf415a8dd6a688089.png

Pi -> mu + nu pattern recognition performance:

5706ec83366e0cb581994cf249853f41.png
cd18e7fe940a6a5d33027095f77708d8.png


07/02/2025 09:58

"Properly" configured Gaudi option files.

all_dir.opts

//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainDetRes" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainDetRes.ExecuteFastResponse = 1;
PIAMainDetRes.ExecuteCaloDigitiser = 0;
PIAMainDetRes.OutputFile = "all_dir.root";
PIAMainDetRes.OutputMode = 8064;
SimReader.Files = {"/simulation/test/pimunu_run00000*.root 1"};
FastResponse.RequireTracker = False;
FastResponse.RequireCalo = False;

//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainDetRes" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainDetRes.ExecuteFastResponse = 1;
PIAMainDetRes.ExecuteCaloDigitiser = 0;
PIAMainDetRes.OutputFile = "all_dir.root";
PIAMainDetRes.OutputMode = 8064;
SimReader.Files = {"/simulation/test/pimunu_run00000*.root 1"};
FastResponse.RequireTracker = False;
FastResponse.RequireCalo = False;

all_rec.opts: (Without Sean's pattern finding)

//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainRec" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainRec.InputFile = "all_dir*.root";
PIAMainRec.InputTree = "rec";
PIAMainRec.InputMode = 8064;
PIAMainRec.OutputFile = "all_rec.root";
PIAMainRec.OutputMode = 1515392;
//PIAMainRec.OutputMode = 0;
PIAMainRec.ExecuteTruthTrackletFinder = 1;
PIAMainRec.ExecuteTruthPatternFinder  = 1;
PIAMainRec.ExecutePionStopLocator     = 1;
PIAMainRec.ExecuteMudifDiscriminant   = 1;
PIAMainRec.ExecutePatternFinder       = 0;
PIAMainRec.ExecuteCaloSingleHitFinder = 0;
PIAMainRec.ExecuteCaloClusterFinder   = 1;
PIAMainRec.ExecuteSummaryCollector    = 1;
PIAMainRec.ExecuteHistogrammer        = 1;

CaloClusterFinder.SpaceThr = 60;

Histogrammer.filename = "all_hst.root";
Histogrammer.calib = "lyso_cal.txt";
Histogrammer.cuts = {
   "time TimeWindow all;-300 -5;5 500",
   "box  AtarBox time 8 8 1.2 4.8",
   "fid  FidTheta box 120",
   "1p   SinglePattern fid",
   "3c   TrippleDep 1p 2",
   "edep PromptLateEdep 1p 10.8 4.5",
   "kink AtarKink edep",
   "doca Doca kink 0.2 0.12",
   "init InitStopDEDX doca 6.4",
   "dedz DelayedDEDZ init 1.5",
   "tkr1 HasTracker fid",
   "tkr2 HasTracker dedz"
};
//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainRec" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainRec.InputFile = "all_dir*.root";
PIAMainRec.InputTree = "rec";
PIAMainRec.InputMode = 8064;
PIAMainRec.OutputFile = "all_rec.root";
PIAMainRec.OutputMode = 1515392;
//PIAMainRec.OutputMode = 0;
PIAMainRec.ExecuteTruthTrackletFinder = 1;
PIAMainRec.ExecuteTruthPatternFinder  = 1;
PIAMainRec.ExecutePionStopLocator     = 1;
PIAMainRec.ExecuteMudifDiscriminant   = 1;
PIAMainRec.ExecutePatternFinder       = 0;
PIAMainRec.ExecuteCaloSingleHitFinder = 0;
PIAMainRec.ExecuteCaloClusterFinder   = 1;
PIAMainRec.ExecuteSummaryCollector    = 1;
PIAMainRec.ExecuteHistogrammer        = 1;

CaloClusterFinder.SpaceThr = 60;

Histogrammer.filename = "all_hst.root";
Histogrammer.calib = "lyso_cal.txt";
Histogrammer.cuts = {
   "time TimeWindow all;-300 -5;5 500",
   "box  AtarBox time 8 8 1.2 4.8",
   "fid  FidTheta box 120",
   "1p   SinglePattern fid",
   "3c   TrippleDep 1p 2",
   "edep PromptLateEdep 1p 10.8 4.5",
   "kink AtarKink edep",
   "doca Doca kink 0.2 0.12",
   "init InitStopDEDX doca 6.4",
   "dedz DelayedDEDZ init 1.5",
   "tkr1 HasTracker fid",
   "tkr2 HasTracker dedz"
};

all_rec.opts (with Sean's pattern finding)

//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainRec" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainRec.InputFile = "all_dir*.root";
PIAMainRec.InputTree = "rec";
PIAMainRec.InputMode = 8064;
PIAMainRec.OutputFile = "all_rec.root";
PIAMainRec.OutputMode = 1515392;
//PIAMainRec.OutputMode = 0;
PIAMainRec.ExecuteTruthTrackletFinder = 1;
PIAMainRec.ExecuteTruthPatternFinder  = 0;
PIAMainRec.ExecutePatternFinder  = 1;
PatternFinder.UseTrackletTimeOrder = true;
PatternFinder.DeltaRThreshold = 1.0;
PIAMainRec.ExecutePionStopLocator     = 1;
PIAMainRec.ExecuteMudifDiscriminant   = 1;
PIAMainRec.ExecuteCaloSingleHitFinder = 0;
PIAMainRec.ExecuteCaloClusterFinder   = 1;
PIAMainRec.ExecuteSummaryCollector    = 1;
PIAMainRec.ExecuteHistogrammer        = 1;
CaloClusterFinder.SpaceThr = 60;
Histogrammer.filename = "all_hst.root";
Histogrammer.calib = "lyso_cal.txt";
Histogrammer.cuts = {
   "time TimeWindow all;-300 -5;5 500",
   "box  AtarBox time 8 8 1.2 4.8",
   "fid  FidTheta box 120",
   "1p   SinglePattern fid",
   "3c   TrippleDep 1p 2",
   "edep PromptLateEdep 1p 10.8 4.5",
   "kink AtarKink edep",
   "doca Doca kink 0.2 0.12",
   "init InitStopDEDX doca 6.4",
   "dedz DelayedDEDZ init 1.5",
   "tkr1 HasTracker fid",
   "tkr2 HasTracker dedz"
};
//##############################################################
// Job options file
//==============================================================
AuditorSvc.Auditors = { "ChronoAuditor" };
//--------------------------------------------------------------
//--------------------------------------------------------------
// Private Application Configuration options
//--------------------------------------------------------------
ApplicationMgr.TopAlg   = { "PIAMainRec" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel  = 3;
//--------------------------------------------------------------
// Event related parameters
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1;
ApplicationMgr.EvtSel = "NONE";
//--------------------------------------------------------------
// Other Service Options
//--------------------------------------------------------------
PIAMainRec.InputFile = "all_dir*.root";
PIAMainRec.InputTree = "rec";
PIAMainRec.InputMode = 8064;
PIAMainRec.OutputFile = "all_rec.root";
PIAMainRec.OutputMode = 1515392;
//PIAMainRec.OutputMode = 0;
PIAMainRec.ExecuteTruthTrackletFinder = 1;
PIAMainRec.ExecuteTruthPatternFinder  = 0;
PIAMainRec.ExecutePatternFinder  = 1;
PatternFinder.UseTrackletTimeOrder = true;
PatternFinder.DeltaRThreshold = 1.0;
PIAMainRec.ExecutePionStopLocator     = 1;
PIAMainRec.ExecuteMudifDiscriminant   = 1;
PIAMainRec.ExecuteCaloSingleHitFinder = 0;
PIAMainRec.ExecuteCaloClusterFinder   = 1;
PIAMainRec.ExecuteSummaryCollector    = 1;
PIAMainRec.ExecuteHistogrammer        = 1;
CaloClusterFinder.SpaceThr = 60;
Histogrammer.filename = "all_hst.root";
Histogrammer.calib = "lyso_cal.txt";
Histogrammer.cuts = {
   "time TimeWindow all;-300 -5;5 500",
   "box  AtarBox time 8 8 1.2 4.8",
   "fid  FidTheta box 120",
   "1p   SinglePattern fid",
   "3c   TrippleDep 1p 2",
   "edep PromptLateEdep 1p 10.8 4.5",
   "kink AtarKink edep",
   "doca Doca kink 0.2 0.12",
   "init InitStopDEDX doca 6.4",
   "dedz DelayedDEDZ init 1.5",
   "tkr1 HasTracker fid",
   "tkr2 HasTracker dedz"
};